<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

</body>
<script>
	// - Symbol中传入的字符串没有任何意义，只是用来描述Symbol
	// {
	// 	let s1 = Symbol("s1");
	// 	let s2 = Symbol("s2");
	// 	let s3 = Symbol("s1");
	// 	console.log(s1, s2);
	// 	console.log(s1 === s3);// false
	//
	//
	// 	// 解决冲突，并提升代码阅读性
	// 	let obj = {
	// 		[s1]:100,
	// 		[s2]:200
	// 	}
	// 	console.log(obj);
	// }
	
	
	// - Symbol不能使用New调用
	// {
	// 	// TypeError: Symbol is not a constructor
	// 	const s1 = new Symbol();
	// }
	
	
	// - 类型转换的时候，不能转数字
	// {
	// 	const s1 = Symbol();
	// 	console.log(s1.toString());// Symbol()
	// 	console.log(String(s1));// Symbol()
	// 	console.log(Number(s1));//  TypeError: Cannot convert a Symbol value to a number
	// }
	
	// - 如果把Symbol当作一个对象的属性和方法的时候，一定要用一个变量来储存，否则定义的属性和方法没有办法使用
	// {
	// 	let s1 = Symbol("s1");
	// 	let obj = {
	// 		[Symbol()]:100,
	// 		[s1]:200
	// 	}
	// 	console.log(obj[Symbol()]);// undefined
	// 	console.log(obj[s1]);// 200
	// }
	
	// - for in 不能遍历出来，可以使用`Object.getOwnPropertySymbols`方法来拿;
	{
		const obj = {
			a: 1,
			[Symbol("s1")]: 200,
			b: 2,
			[Symbol("s2")]: 300,
			c: 3
		};
		// 以下遍历结果：a  b  c
		// for(let key in obj){
		// 	console.log(key);
		// }
		
		// 通过Object.getOwnPropertySymbols:获取到数组，数组的元素即是obj对象下所有类型为Symbol的属性名。
		// console.log(Object.getOwnPropertySymbols(obj));// [Symbol(s1), Symbol(s2)]
		// for(let key in Object.getOwnPropertySymbols(obj)){
		// 	console.log(obj[Object.getOwnPropertySymbols(obj)[key]])
		// }
		// let arrSymbols = Object.getOwnPropertySymbols(obj);// [Symbol(s1), Symbol(s2)]
		// for(let key in arrSymbols){
		// 	console.log(obj[arrSymbols[key]])
		// }
		
		// console.log([...Object.keys(obj),...Object.getOwnPropertySymbols(obj)])
		const arr = [
			...Object.keys(obj),
			...Object.getOwnPropertySymbols(obj)
		];
		arr.forEach(key=>{
			console.log(key,obj[key]);
		})
		
	}
</script>
</html>